/*
 * 文件名：LogSchedule.java	 
 * 时     间：下午6:31:34
 * 作     者：lyf       
 * 版     权： 2012-2022 湖南智软网络科技, 公司保留所有权利.
 * 联     系：http://www.073586.com/
 */
package com.schedule.log;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import com.cz073586.tools.util.Log4jUtil;
import com.cz073586.tools.util.Tools;
import com.local.model.Log;
import com.local.model.LogExample;
import com.local.page.LogPageInfo;
import com.local.service.face.LogService;
import com.local.util.NetWorkUtil;
import com.message.utils.MessageCfgManager;
import com.qianhai.common.spring.utils.SpringContextUtil;
import common.message.receive.manager.ReceiveClientManager;

/**
 * 类描述: 系统异常日志管理,功能包含:清理已处理的日志、自动修复异常，如：断网请款下车牌无法正常上传云系统.
 * 
 * @ClassName: LogSchedule
 * @author liyf
 * @date 2015年10月25日 下午6:31:34
 */
@Service
@EnableScheduling
public class LogSchedule
{
	
	private Log4jUtil log = Log4jUtil.getLog4j(LogSchedule.class);
	
	@Autowired
	private LogService logService;
	
	/**
	 * 
	 * 方法描述： 每间隔一天清理已经处理系统异常.
	 * 
	 * @Title: clearFixedLog
	 * @param
	 * @return void
	 * @user lyf 2015年10月25日
	 * @throws
	 */
	@Scheduled(fixedDelay = 1000 * 60 * 60 * 24)
	public void clearFixedLog()
	{
		
		try
		{
			
			LogExample condition = new LogExample();
			condition.or().andStatusEqualTo(2);
			logService.deleteByCondition(condition);
			System.out.println(new Date() + "   清理已经修复日志完成.");
		} catch (Throwable e)
		{
			log.error("", e);
		}
	}
	
	/**
	 * 
	 * 方法描述： 自动修复网络断开异常
	 * 
	 * @Title: autoFixMessageException
	 * @param
	 * @return void
	 * @user lyf 2015年10月25日
	 * @throws
	 */
	@Scheduled(fixedDelay = 1000 * 30)
	public void autoFixMessageException()
	{
		try
		{
			// System.out.println(new Date() + "监听网络情况.");
			LogExample condition = new LogExample();
			condition.or().andStatusEqualTo(1).andModuleEqualTo(0);
			List<Log> logs = logService.selectByCondition(condition);
			if (!logs.isEmpty())
			{
				// 检查网络是否畅通
				String host = MessageCfgManager.instance()
						.getCfgPropertiesByKey("server_host");
				String port = MessageCfgManager.instance()
						.getCfgPropertiesByKey("server_port");
				
				if (!Tools.isEmpty(host) && !Tools.isEmpty(port))
				{
					boolean isConenct = NetWorkUtil.canConnection(host,
							Integer.parseInt(port), 60000);
					if (isConenct)
					{
						ReceiveClientManager.instance().destroy();
						ReceiveClientManager.instance().springStart();
						logService.deleteByCondition(condition);
					}
				}// end if
			}// end if
			
		} catch (Throwable e)
		{
			log.error("", e);
		}
	}
	
	/**
	 * 
	 * 方法描述：每隔10秒自动修复系统异常.
	 * 
	 * @Title: autoFixSystemExcption
	 * @param
	 * @return void
	 * @user lyf 2015年10月25日
	 * @throws
	 */
	@Scheduled(fixedDelay = 1000 * 20)
	public void autoFixSystemExcption()
	{
		
		try
		{
			if(log.isDebugEnabled())
			{
				Long xmx=Runtime.getRuntime().maxMemory(); //最大可用内存，对应-Xmx 

				Long jvmFree=Runtime.getRuntime().freeMemory(); //当前JVM空闲内存 

				Long jvmOld=Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数，其值相当于当前JVM已使用的内存及freeMemory()的总和 
				
				StringBuilder jvm=new StringBuilder("最大可用内存:"+xmx.toString()+"  当前JVM空闲内存 :"+jvmFree.toString()+"  当前JVM占用的内存总数:"+jvmOld.toString());
				
				log.debug(jvm.toString());
			}
			
			// System.out.println(new Date() + "自动修复系统异常.");
			// 自动修复没有上传到云的数据,一条一条修复
			if (SyncManager.instance().checkCloudService())
			{
				// 一次轮训只修复一条
				LogPageInfo logInfoPage = new LogPageInfo();
				logInfoPage.setPageSize(1);
				logService.queryByPage(logInfoPage);
				
				if (!Tools.isEmpty(logInfoPage.getData())
						&& !logInfoPage.getData().isEmpty())
				{
					RepairLog logService = SpringContextUtil.getApplicationContext().getBean(
							RepairLog.class);
					if(!Tools.isEmpty(logService))
					{
						logService.rePainLog(logInfoPage.getData().get(0));
					}
				}
			}
		} catch (Throwable e)
		{
			System.out.println("修复失败.");
			log.error("", e);
		}
	}
}
